Background
This is my go-to template for work projects. I wanted a notebook with some minimal slide functionality without having to separate/commit whole hog to a separate ioslides output or whatever. Helps maintain flow.
Don’t want a dependency of a theme package, just plain ol HTML/CSS/JS
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Plan
Gantt and ER don’t work
Flowchart
htmltools::HTML('
<div class="mermaid">
graph LR
A --- B
B-->C
B-->D
</div>
')
graph LR
A --- B
B-->C
B-->D
User Journey
htmltools::HTML('
<div class="mermaid">
journey
title My working day
section Go to work
Make tea: 5: Me
Go upstairs: 3: Me
Do work: 1: Me, Cat
section Go home
Go downstairs: 5: Me
Sit down: 5: Me
</div>
')
journey
title My working day
section Go to work
Make tea: 5: Me
Go upstairs: 3: Me
Do work: 1: Me, Cat
section Go home
Go downstairs: 5: Me
Sit down: 5: Me
Sequence Diagram
htmltools::HTML('
<div class="mermaid">
sequenceDiagram
participant John
participant Alice
Alice->>John: Hello John, how are you?
John-->>Alice: Great!
</div>
')
sequenceDiagram
participant John
participant Alice
Alice->>John: Hello John, how are you?
John-->>Alice: Great!
Work
Data cleaning and stuff
var x = 10;
a
knitr::opts_chunk$set(echo = TRUE)
t(t(letters))
## [,1]
## [1,] "a"
## [2,] "b"
## [3,] "c"
## [4,] "d"
## [5,] "e"
## [6,] "f"
## [7,] "g"
## [8,] "h"
## [9,] "i"
## [10,] "j"
## [11,] "k"
## [12,] "l"
## [13,] "m"
## [14,] "n"
## [15,] "o"
## [16,] "p"
## [17,] "q"
## [18,] "r"
## [19,] "s"
## [20,] "t"
## [21,] "u"
## [22,] "v"
## [23,] "w"
## [24,] "x"
## [25,] "y"
## [26,] "z"
b
knitr::opts_chunk$set(echo = TRUE)
letters
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
Findings/Recommendations
This section can function as slides if there’s not too much to show. See “Slides” for slides within a tab.
Except on Mars!
Slides
Can’t link to these
⟵
⟶
1
As you can see here, the results speak for themselves.
2
As you can see here, the results speak for themselves.
3
As you can see here, the results speak for themselves.
Appendix
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com .
R Session Info
sessionInfo()
## R version 3.5.1 (2018-07-02)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18362)
##
## Matrix products: default
##
## locale:
## [1] LC_COLLATE=English_United States.1252
## [2] LC_CTYPE=English_United States.1252
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.1252
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] glue_1.3.0 dplyr_0.8.5 plotly_4.8.0 ggplot2_3.1.0
##
## loaded via a namespace (and not attached):
## [1] Rcpp_1.0.4 later_1.0.0 pillar_1.3.1
## [4] compiler_3.5.1 plyr_1.8.4 base64enc_0.1-3
## [7] tools_3.5.1 digest_0.6.25 viridisLite_0.3.0
## [10] jsonlite_1.5 evaluate_0.14 tibble_2.0.1
## [13] gtable_0.2.0 pkgconfig_2.0.2 rlang_0.4.5
## [16] shiny_1.4.0.2 crosstalk_1.0.0 yaml_2.2.0
## [19] xfun_0.8 fastmap_1.0.1 withr_2.1.2
## [22] stringr_1.4.0 httr_1.4.0 knitr_1.23
## [25] htmlwidgets_1.5.1 grid_3.5.1 tidyselect_0.2.5
## [28] data.table_1.12.2 R6_2.3.0 rmarkdown_1.13
## [31] tidyr_0.8.2 purrr_0.2.5 magrittr_1.5
## [34] promises_1.1.0 scales_1.0.0 htmltools_0.4.0.9003
## [37] assertthat_0.2.0 xtable_1.8-3 mime_0.6
## [40] colorspace_1.4-0 httpuv_1.5.2 labeling_0.3
## [43] stringi_1.2.4 lazyeval_0.2.1 munsell_0.5.0
## [46] crayon_1.3.4
LS0tDQpwYXJhbXM6DQogIGppcmE6ICJIQlJBLTk5Ig0KICBnaXRodWI6ICJnaXRodWIuY29tIg0KICBjb25mbHVlbmNlOiAiaHR0cHM6Ly93d3cuYXRsYXNzaWFuLmNvbS9zb2Z0d2FyZS9jb25mbHVlbmNlIg0KICB0aXRsZTogIkFyZSB0aXRsZXMgcGhyYXNlZCBhcyBxdWVzdGlvbnMgbW9yZSBlbmdhZ2luZyB0aGFuIHN0YXRlbWVudHM/Ig0KICAjbG9nb191cmw6ICJodHRwczovL2hici5vcmcvcmVzb3VyY2VzL2Nzcy9pbWFnZXMvSEJSX2xvZ29fYmxhY2suc3ZnIg0KICBhY2NlbnRfY29sb3I6ICIjYzgyNTAyIg0KICBzb2NpYWxfZmlsbDogImJsYWNrIg0KdGl0bGU6ICdgciBwYXJhbXMkdGl0bGVgJw0KYXV0aG9yOiAiQXV0aG9ycyIgIyAnYHIgU3lzLmluZm8oKVs3XWAnDQpkYXRlOiAnYHIgU3lzLnRpbWUoKWAnDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBrZWVwX21kOiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQotLS0NCg0KPHN0eWxlPg0KQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Tb3VyY2UrU2FucytQcm8mZGlzcGxheT1zd2FwJyk7DQoNCmJvZHkge2ZvbnQtZmFtaWx5OiAiU291cmNlIFNhbnMgUHJvIiwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O30NCmgxLCBoMiwgaDMsIGg0LCBoNSB7Zm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OyBwYWRkaW5nLXRvcDogMnJlbTt9DQphIHtjb2xvcjogYHIgcGFyYW1zJGFjY2VudF9jb2xvcmB9DQouYXV0aG9yLCAuZGF0ZSB7cGFkZGluZy10b3A6IDFyZW07fQ0KLyoNCg0KLyogLS0tLSBUT0MgLS0tLSAqLw0KLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzLCAubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjogYHIgcGFyYW1zJGFjY2VudF9jb2xvcmA7IGJvcmRlci1jb2xvcjogYHIgcGFyYW1zJGFjY2VudF9jb2xvcmA7IG1hcmdpbi1sZWZ0OiAtMnJlbTsgcGFkZGluZy1sZWZ0OiAycmVtO30NCi50b2NpZnksIC5uYXYtdGFicyA+IGxpID4gYSB7d2Via2l0LWJvcmRlci1yYWRpdXM6IHVuc2V0OyBtb3otYm9yZGVyLXJhZGl1czogdW5zZXQ7IGJvcmRlci1yYWRpdXM6IHVuc2V0O30NCi50b2NpZnk6OmJlZm9yZSB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGByIHBhcmFtcyRsb2dvX3VybGApOyBtYXJnaW4tYm90dG9tOiAycmVtOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGNvbnRlbnQ6ICIiOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDBweDsgYmFja2dyb3VuZC1zaXplOiAxNTBweDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBkaXNwbGF5OiBgciBpZmVsc2UoaXMuY2hhcmFjdGVyKHBhcmFtcyRsb2dvX3VybCksICJpbmhlcml0IiwgIm5vbmUiKWB9DQoudG9jaWZ5Om50aC1jaGlsZCgxKSB1bDpudGgtY2hpbGQoMSk6OmJlZm9yZSB7Y29udGVudDogImByIHBhcmFtcyR0aXRsZWAiOyBwYWRkaW5nLWxlZnQ6IC4yNXJlbTsgcGFkZGluZy1yaWdodDogLjVyZW07IGRpc3BsYXk6IGlubGluZS1ibG9jazt9DQoudG9jaWZ5IHVsIGxpOmZpcnN0LW9mLXR5cGUge21hcmdpbi10b3A6IDFyZW07fQ0KLnRvY2lmeSB7cGFkZGluZy10b3A6IDJyZW07IHBhZGRpbmctYm90dG9tOiAycmVtO30NCi50b2NpZnktaGVhZGVyIHt0ZXh0LWluZGVudDogdW5zZXQgIWltcG9ydGFudDsgcGFkZGluZy1sZWZ0OiAycmVtO30NCnVsLnRvY2lmeS1oZWFkZXIge3BhZGRpbmctbGVmdDogMXJlbTt9DQoubmF2LXRhYnMge3BhZGRpbmctdG9wOiAxcmVtO30NCg0Kc3VtbWFyeSB7cGFkZGluZzogMXJlbTsgYm9yZGVyOiAxcHggc29saWQgI2FiYWZiMDt9DQoNCi8qIHNsaWRlIHN0dWZmICovDQoubm9zZWxlY3Qgew0KICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7IC8qIGlPUyBTYWZhcmkgKi8NCiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyAvKiBTYWZhcmkgKi8NCiAgICAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOyAvKiBLb25xdWVyb3IgSFRNTCAqLw0KICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7IC8qIEZpcmVmb3ggKi8NCiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOyAvKiBJbnRlcm5ldCBFeHBsb3Jlci9FZGdlICovDQogICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsgLyogTm9uLXByZWZpeGVkIHZlcnNpb24sIGN1cnJlbnRseQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSBDaHJvbWUgYW5kIE9wZXJhICovDQp9DQoNCi5uYXYtYXJyb3cgeyBmb250LXNpemU6IDMwcHg7IGNvbG9yOiBgciBwYXJhbXMkYWNjZW50X2NvbG9yYDsgYmFja2dyb3VuZDogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyLXJhZGl1czogMzBweDsgYm9yZGVyOiAxcHggc29saWQgbGlnaHRncmV5O30NCg0KLmZpeGVkLWhlaWdodCB7IG1heC1oZWlnaHQ6IDQwMHB4ICFpbXBvcnRhbnQ7IG92ZXJmbG93OiBhdXRvOyB9DQoNCi5hdXRob3IsIC5kYXRlIHsNCmRpc3BsYXk6IGlubGluZS1ibG9jazsNCmNvbG9yOiBncmV5Ow0KZm9udC13ZWlnaHQ6IG5vcm1hbCAhaW1wb3J0YW50Ow0KfQ0KDQouZGF0ZSB7DQpwYWRkaW5nLWxlZnQ6IDNyZW07DQp9DQoNCjwvc3R5bGU+DQoNCjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9tZXJtYWlkLzguNS4xL21lcm1haWQubWluLmpzIj48L3NjcmlwdD4NCg0KIyMgQmFja2dyb3VuZA0KDQpUaGlzIGlzIG15IGdvLXRvIHRlbXBsYXRlIGZvciB3b3JrIHByb2plY3RzLiBJIHdhbnRlZCBhIG5vdGVib29rIHdpdGggc29tZSBtaW5pbWFsIHNsaWRlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBoYXZpbmcgdG8gc2VwYXJhdGUvY29tbWl0IHdob2xlIGhvZyB0byBhIHNlcGFyYXRlIGlvc2xpZGVzIG91dHB1dCBvciB3aGF0ZXZlci4gSGVscHMgbWFpbnRhaW4gZmxvdy4gDQoNCkRvbid0IHdhbnQgYSBkZXBlbmRlbmN5IG9mIGEgdGhlbWUgcGFja2FnZSwganVzdCBwbGFpbiBvbCBIVE1ML0NTUy9KUw0KDQo+IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4gW14xXQ0KDQoNClteMV06IGZvb3Rub3RlDQoNCiMjIyBQbGFuIHsudGFic2V0fQ0KDQpHYW50dCBhbmQgRVIgZG9uJ3Qgd29yaw0KDQojIyMjIEZsb3djaGFydA0KYGBge3IsIHJlc3VsdHM9ImFzaXMifQ0KaHRtbHRvb2xzOjpIVE1MKCcNCiAgPGRpdiBjbGFzcz0ibWVybWFpZCI+DQogIGdyYXBoIExSDQogICAgICBBIC0tLSBCDQogICAgICBCLS0+Qw0KICAgICAgQi0tPkQNCiAgPC9kaXY+DQogICcpDQpgYGANCg0KIyMjIyBVc2VyIEpvdXJuZXkgDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyJ9DQpodG1sdG9vbHM6OkhUTUwoJw0KICA8ZGl2IGNsYXNzPSJtZXJtYWlkIj4NCmpvdXJuZXkNCiAgICB0aXRsZSBNeSB3b3JraW5nIGRheQ0KICAgIHNlY3Rpb24gR28gdG8gd29yaw0KICAgICAgTWFrZSB0ZWE6IDU6IE1lDQogICAgICBHbyB1cHN0YWlyczogMzogTWUNCiAgICAgIERvIHdvcms6IDE6IE1lLCBDYXQNCiAgICBzZWN0aW9uIEdvIGhvbWUNCiAgICAgIEdvIGRvd25zdGFpcnM6IDU6IE1lDQogICAgICBTaXQgZG93bjogNTogTWUNCiAgPC9kaXY+DQogICcpDQpgYGANCg0KIyMjIyBTZXF1ZW5jZSBEaWFncmFtDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyJ9DQpodG1sdG9vbHM6OkhUTUwoJw0KICA8ZGl2IGNsYXNzPSJtZXJtYWlkIj4NCnNlcXVlbmNlRGlhZ3JhbQ0KICAgIHBhcnRpY2lwYW50IEpvaG4NCiAgICBwYXJ0aWNpcGFudCBBbGljZQ0KICAgIEFsaWNlLT4+Sm9objogSGVsbG8gSm9obiwgaG93IGFyZSB5b3U/DQogICAgSm9obi0tPj5BbGljZTogR3JlYXQhDQogIDwvZGl2Pg0KICAnKQ0KYGBgDQoNCiMjIFdvcmsgey50YWJzZXR9DQpEYXRhIGNsZWFuaW5nIGFuZCBzdHVmZg0KDQpgYGBqcw0KdmFyIHggPSAxMDsNCmBgYA0KDQojIyMgYSB7LmZpeGVkLWhlaWdodH0NCmBgYHtyfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KdCh0KGxldHRlcnMpKQ0KYGBgDQoNCiMjIyBiIHsuZml4ZWQtaGVpZ2h0fQ0KYGBge3J9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsZXR0ZXJzDQpgYGANCg0KDQojIyBGaW5kaW5ncy9SZWNvbW1lbmRhdGlvbnMgey50YWJzZXR9DQpUaGlzIHNlY3Rpb24gY2FuIGZ1bmN0aW9uIGFzIHNsaWRlcyBpZiB0aGVyZSdzIG5vdCB0b28gbXVjaCB0byBzaG93LiBTZWUgIlNsaWRlcyIgZm9yIHNsaWRlcyB3aXRoaW4gYSB0YWIuDQoNCiMjIyBSZXZlbnVlIGlzIHVwIQ0KDQpgYGB7ciBjYXJzLCBjb2xzLnByaW50ID0gMywgcm93cy5wcmludCA9IDV9DQptdGNhcnMNCmBgYA0KDQojIyMgRXhjZXB0IG9uIE1hcnMhDQoNCmBgYHtyIHByZXNzdXJlLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9IjgwJSJ9DQpwbG90KHByZXNzdXJlKQ0KYGBgDQoNCg0KIyMjIFNsaWRlcyB7LnRhYnNldCAudGFibmF2fQ0KQ2FuJ3QgbGluayB0byB0aGVzZQ0KDQo8ZGl2IHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwYWRkaW5nOiAxcmVtOyI+DQo8YnV0dG9uIGNsYXNzPSJuYXYtYXJyb3cgbm9zZWxlY3QiIHN0eWxlPSJmbG9hdDpsZWZ0OyB3aWR0aDogNTAlOyIgb25jbGljaz0iZ29CYWNrd2FyZCgpIj7in7U8L2J1dHRvbj4NCg0KPGJ1dHRvbiBjbGFzcz0ibmF2LWFycm93IG5vc2VsZWN0IiBzdHlsZT0id2lkdGg6IDUwJTsiIG9uY2xpY2s9ImdvRm9yd2FyZCgpIj7in7Y8L2J1dHRvbj4NCg0KPC9kaXY+DQoNCiMjIyMgYHIgbiA8LSAxOyBuYCANCkFzIHlvdSBjYW4gc2VlIGhlcmUsIHRoZSByZXN1bHRzIHNwZWFrIGZvciB0aGVtc2VsdmVzLiANCmBgYHtyIHNsaWRlIHNldHVwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeShnbHVlKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQob3V0LndpZHRoID0gIjEwMCUiKQ0KDQpnIDwtIGRhdGEuZnJhbWUoYT0xOjEwLCBiPXNhbXBsZSgxOjEwMCwgMTApKSAlPiUgDQogIHsgZ2dwbG90KC4sIGFlcyh4PWEsIHk9YikpICsgDQogICAgICBnZW9tX3BvaW50KCkgKyANCiAgICAgIGxhYnModGl0bGU9Ik15IHRpdGxlIiwgc3VidGl0bGUgPSAiQmFzZWQgb24gZGF0YSBmcm9tIDIwMjAtMDEgdG8gMjAyMC0wMiIsIGNhcHRpb24gPSAibXkgY2FwdGlvbiIpDQogIH0gDQoNCmcgDQpgYGANCg0KIyMjIyBgciBuIDwtIG4rMTsgbmANCkFzIHlvdSBjYW4gc2VlIGhlcmUsIHRoZSByZXN1bHRzIHNwZWFrIGZvciB0aGVtc2VsdmVzLiANCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpnZ3Bsb3RseShnKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gZ2x1ZSgie3RpdGxlfTxicj48c3VwPntzdWJ0aXRsZX08L3N1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZyRsYWJlbHMkdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBnJGxhYmVscyRzdWJ0aXRsZQ0KICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICApDQpgYGANCg0KIyMjIyBgciBuIDwtIG4rMTsgbmANCkFzIHlvdSBjYW4gc2VlIGhlcmUsIHRoZSByZXN1bHRzIHNwZWFrIGZvciB0aGVtc2VsdmVzLiANCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpkYXRhLmZyYW1lKGE9MToxMCwgYj1zYW1wbGUoMToxMDAsIDEwKSkgJT4lIHsgZ2dwbG90KC4sIGFlcyh4PWEsIHk9YikpICsgZ2VvbV9wb2ludCgpfSAlPiUgZ2dwbG90bHkoLikNCmBgYA0KDQoNCi0tLQ0KDQojIyBBcHBlbmRpeA0KDQpUaGlzIGlzIGFuIFIgTWFya2Rvd24gZG9jdW1lbnQuIE1hcmtkb3duIGlzIGEgc2ltcGxlIGZvcm1hdHRpbmcgc3ludGF4IGZvciBhdXRob3JpbmcgSFRNTCwgUERGLCBhbmQgTVMgV29yZCBkb2N1bWVudHMuIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgUiBNYXJrZG93biBzZWUgPGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20+Lg0KDQo8ZGV0YWlscz48c3VtbWFyeT5SIFNlc3Npb24gSW5mbzwvc3VtbWFyeT4NCg0KYGBge3J9DQpzZXNzaW9uSW5mbygpDQpgYGANCg0KPC9kZXRhaWxzPg0KDQo8c3R5bGU+DQouZm9vdG5vdGVzIGhyIHtkaXNwbGF5OiBub25lO30NCjwvc3R5bGU+DQoNCiMjIEZvb3Rub3Rlcw0KDQpgYGB7cn0NCmxpYnJhcnkoZm9udGF3ZXNvbWUpDQpsaW5rcyA8LSBzYXBwbHkoYygiZ2l0aHViIiwgInR3aXR0ZXIiLCAibGlua2VkaW4iKSwgZmEsIGZpbGw9cGFyYW1zJHNvY2lhbF9maWxsKSAlPiUNCiAgcGFzdGUoY29sbGFwc2U9IiIpDQoNCmxpbmtzIDwtIGdzdWIoIjxzdmciLCAiPGEgaHJlZj0naHR0cHM6Ly9oYnIub3JnJz48c3ZnIiwgbGlua3MpDQpsaW5rcyA8LSBnc3ViKCI8L3N2ZyIsICI8L3N2Zz48L2EiLCBsaW5rcykNCg0KbGlua3MgPC0gc3ViKCJoYnIub3JnIiwgImdpdGh1Yi5jb20iLCBsaW5rcykNCmxpbmtzIDwtIHN1YigiaGJyLm9yZyIsICJ0d2l0dGVyLmNvbSIsIGxpbmtzKQ0KbGlua3MgPC0gc3ViKCJoYnIub3JnIiwgImxpbmtlZGluLmNvbSIsIGxpbmtzKQ0KDQpgYGANCg0KPHN0eWxlPg0KW2lkKj0idG9jaWZ5LWhlYWRlciJdOmxhc3Qtb2YtdHlwZSB7DQpmb250LXNpemU6IDNyZW07DQpjdXJzb3I6IHVuc2V0Ow0KbGV0dGVyLXNwYWNpbmc6IDJyZW07DQp9DQphIHN2Zzpob3ZlciB7DQpmb250LXNpemU6IDEyMCUgIWltcG9ydGFudDsNCn0NCiNzb2NpYWwtbGlua3Mge2Rpc3BsYXk6bm9uZTt9DQo8L3N0eWxlPg0KDQojIyBgciBsaW5rc2AgeyNzb2NpYWwtbGlua3N9DQoNCjxzY3JpcHQ+DQp2YXIgY29uZmlnID0gew0KICAgIHN0YXJ0T25Mb2FkOnRydWUsDQogICAgZmxvd2NoYXJ0OnsNCiAgICAgICAgdXNlTWF4V2lkdGg6ZmFsc2UsDQogICAgICAgIGh0bWxMYWJlbHM6dHJ1ZQ0KICAgIH0NCn07DQptZXJtYWlkLmluaXRpYWxpemUoY29uZmlnKTsNCiAgICANCmZ1bmN0aW9uIGdvQmFja3dhcmQoKSB7DQogIGxldCBwcmV2aW91cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnRhYm5hdiA+IHVsLm5hdiA+IGxpIikpLmluZGV4T2YoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRhYm5hdiA+IHVsLm5hdiA+IGxpLmFjdGl2ZSIpKS0xOw0KICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudGFibmF2ID4gdWwubmF2ID4gbGkgPiBhIilbcHJldmlvdXNdLmNsaWNrKCkNCn07DQoNCmZ1bmN0aW9uIGdvRm9yd2FyZCgpIHsNCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRhYm5hdiA+IHVsLm5hdiA+IGxpLmFjdGl2ZSArIGxpID4gYSIpLmNsaWNrKCk7DQp9Ow0KPC9zY3JpcHQ+DQoNCg==